package iserver

import (
	"src/zeus/timerwheel"
	"time"
)

const (
	// BroadcastChannel 广播消息频道
	BroadcastChannel = "broadcast"

	// RPCChannel 频道
	RPCChannel = "rpc"

	// MailOnlineChannel 给符合条件的在线玩家发邮件
	MailOnlineChannel = "mailonline"

	// QueryAllMail Lobby --> Center 请求全部的全服邮件
	QueryAllMail = "queryallmail"
)

// 提供给子系统，退出的回调
type IReleaseAble interface {
	Release()
}

// IServerCtrl 后代服务器类需要继承的接口
type IServerCtrl interface {
	Init() error
	MainLoop()
	Destroy()

	GetLoad() int
	// 当有服务的连接关闭的时候
	ServerSessClosed(param ...interface{})
	// 我连接到别的服务器了 当有服务的连接建立的时候
	ServerSessConnect(srvID uint64, srvType uint8)
	// 监听逻辑
	WatchServer()
}

// IServer 基础Server提供的接口
// 接口都是非线程安全，注意调用线程
type IServer interface {
	ISrvNet
	timerwheel.ITimer
	// events.IEvents
	IEntities
	IEntityProto
	IUIDFetcher
	IUIDGenerater
	//IServerCtrl

	GetFrameDeltaTime() time.Duration
	GetStartupTime() time.Time
	Init() error
	Run()
	Close()
	GetLoad() int
	GetGroupId() uint32

	IsSrvValid() bool
	HandlerSrvInvalid(entityID uint64)

	RegEntitiesMsgProc(proc interface{})

	// 服务器内部通讯令牌 Config.LoginSrvVerifyToken
	GetGSVT() string
	SetGSVT(string)

	RegRelease(r IReleaseAble)
	TryConnectToSrv(*ServerInfo)

	//当有服务的连接关闭的时候
	ServerSessClosed(param ...interface{})
	//当有服务器连接的时候
	ServerSessConnect(srvID uint64, srvType uint8)

	GetRecover() bool

	//Player保存使用的Stype
	GetSaveType() uint8

	// 获取服务器当前时间
	GetNowTime() time.Time
}

var srvInst IServer

// GetSrvInst 获取当前服务器
func GetSrvInst() IServer {
	return srvInst
}

// SetSrvInst 设置单例
func SetSrvInst(srv IServer) {
	srvInst = srv
}
